package com.exprecards.common.web;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.FileUtils;
import org.richfaces.event.FileUploadEvent;
import org.richfaces.exception.FileUploadException;
import org.richfaces.model.UploadedFile;

import com.exprecards.common.persistence.DAOFactory;
import com.exprecards.common.persistence.dto.ExpTbLineaProducto;
import com.exprecards.common.persistence.dto.ExpTbProducto;
import com.exprecards.common.persistence.dto.ExpTbProductoPk;
import com.exprecards.common.persistence.exceptions.ExpTbLineaProductoDaoException;
import com.exprecards.common.persistence.exceptions.ExpTbProductoDaoException;
import com.exprecards.common.util.WebUtils;

@ManagedBean(name = "crudProductoBean")
@ViewScoped
public class CRUDProductoBean extends GenericCrudBean<ExpTbProducto> {

	private static final long serialVersionUID = 1L;

	
	@ManagedProperty("#{userSessionBean}")
	private UserSessionBean userSessionBean;
	
	
	private int tipoUsuario;
	
	private boolean  showPopupPanelDuplicados = true;
	
	private int idLineaProductoSelected = 0;
	private ExpTbLineaProducto lineaProductoSelected;
	
	private List<SelectItem> lineaProductoList = null;  
	
	private String urlImagenPreview="";
	
	
	public CRUDProductoBean() throws ExpTbProductoDaoException{
		super();
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
		
		userSessionBean = (UserSessionBean)session.getAttribute("userSessionBean");
		
		//this.lista = consultar();
		//this.listaSimple = consultarSimple();
	}
	
	
	public void asignarImagen(){
		
		
	}
	
	public void listener(FileUploadEvent event) {
    	
    	UploadedFile item = event.getUploadedFile();
    	
    	String nombre = item.getName().replace(' ', '_');
    	//Escritura Archivo
        File archivo = new File(CacheParametrosBean.getInstance().getPathContexto() + CacheParametrosBean.getInstance().getPathArchivos() + nombre);
        
        try {
			FileUtils.writeByteArrayToFile(archivo, item.getData());
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
        
        this.valorActual.setUrlImagen(nombre); 
        
}
	
    public void actionSeleccionarLineaProducto(){
		
		try {
			lineaProductoSelected = DAOFactory.getExpTbLineaProductoDao().findByPrimaryKey(idLineaProductoSelected);
			this.listaSimple = DAOFactory.getExpTbProductoDao().findByExpTbLineaProducto(idLineaProductoSelected);
			this.valorActual=new ExpTbProducto();
		} catch (ExpTbLineaProductoDaoException e) {
			e.printStackTrace();
		} catch (ExpTbProductoDaoException e) {
			e.printStackTrace();
		}
	} 
	
	public boolean isShowPopupPanelDuplicados() {
		return showPopupPanelDuplicados;
	}

	public void setShowPopupPanelDuplicados(boolean showPopupPanelDuplicados) {
		this.showPopupPanelDuplicados = showPopupPanelDuplicados;
	}

	
	
	@Override
	protected boolean create() throws Exception{
		
		boolean result = false;
		
		this.valorActual.setEstado("A");
		
		DAOFactory.getExpTbProductoDao().insert(this.valorActual);
			
		result=true;
		
		return result;
	}
	
	@Override
	protected boolean update() throws Exception{
		
		boolean result = false;
		
		DAOFactory.getExpTbProductoDao().update(new ExpTbProductoPk(this.valorActual.getId()),this.valorActual);
		
		return result;
	}

	@Override
	protected void editable(int id) throws Exception{
		valorActual = DAOFactory.getExpTbProductoDao().findByPrimaryKey(id);
	}

	@Override
	protected void delete(int id) throws Exception{
		DAOFactory.getExpTbProductoDao().delete(new ExpTbProductoPk(id));
	}

	@Override
	protected List<Map<String, String>> consultar() {
		
		return null;
	}

	
	@Override
	protected ExpTbProducto[] consultarSimple() throws ExpTbProductoDaoException {
		
		if(idLineaProductoSelected!=0){
			
			this.listaSimple = DAOFactory.getExpTbProductoDao().findByExpTbLineaProducto(idLineaProductoSelected);
		}
		else{
			this.listaSimple = DAOFactory.getExpTbProductoDao().findAll();
		}
		
		return this.listaSimple;
	}
	
	@Override
	protected ExpTbProducto createNew() {
		return new ExpTbProducto();
	}

	@Override
	protected boolean isId() {
		boolean result = false;
		if(valorActual.getId()==0){
			result = false;  
		}
		else{
			result = true;
		}
		return result;
	}
	
	@Override
	protected void clean(){
		
	}
	

	/**
	 * @return the userSessionBean
	 */
	public UserSessionBean getUserSessionBean() {
		return userSessionBean;
	}

	/**
	 * @param userSessionBean the userSessionBean to set
	 */
	public void setUserSessionBean(UserSessionBean userSessionBean) {
		this.userSessionBean = userSessionBean;
	}
	

	public int getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(int tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}
	
	public int getIdLineaProductoSelected() {
		return idLineaProductoSelected;
	}


	public void setIdLineaProductoSelected(int idLineaProductoSelected) {
		this.idLineaProductoSelected = idLineaProductoSelected;
	}


	public ExpTbLineaProducto getLineaProductoSelected() {
		return lineaProductoSelected;
	}


	public void setLineaProductoSelected(ExpTbLineaProducto lineaProductoSelected) {
		this.lineaProductoSelected = lineaProductoSelected;
	}


	public List<SelectItem> getLineaProductoList() {

		ExpTbLineaProducto lp;
		try {
			lp = DAOFactory.getExpTbLineaProductoDao().findByPrimaryKey(
					idLineaProductoSelected);

			if (lp != null) {
				lineaProductoList = WebUtils
						.createSelectItem(DAOFactory.getExpTbLineaProductoDao()
								.findWhereEmpresaEquals(lp.getEmpresa()), false);
			}

		} catch (ExpTbLineaProductoDaoException e) {
			e.printStackTrace();
		}

		return lineaProductoList;
	}


	public void setLineaProductoList(List<SelectItem> lineaProductoList) {
		this.lineaProductoList = lineaProductoList;
	}


	public String getUrlImagenPreview() {
		return urlImagenPreview;
	}


	public void setUrlImagenPreview(String urlImagenPreview) {
		this.urlImagenPreview = urlImagenPreview;
	}

}
